package com.offcn.order.service.impl;

import com.offcn.entity.Result;
import com.offcn.order.entity.Cart;
import com.offcn.order.pojo.OrderItem;
import com.offcn.order.service.CartService;
import com.offcn.sellergoods.feign.ItemFeign;
import com.offcn.sellergoods.pojo.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;


@Service
public class CartServiceImpl implements CartService {


    @Autowired
    private ItemFeign itemFeign;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @param cartList 原购物车数据
     * @param itemId   购买的商品
     * @param num      购买的数量
     * @return 1：根据商品sukid 查询商品信息
     * 2： 获取商家id
     * 3：根据商家 id 判断 购物车是否含有该商家的购物车数据
     * 4： 如果数据库中不存在 该商家购物车
     * 5： 新建购物车对象
     * 6：把购物车对象存储到List《Cart》
     * 7：如果购物车列表中存在该商家的购物车
     * 8： 判断购物车明细中是否含有该商品
     * 9：如果没有，新增购物车明细
     * 10：如果有，增加数量，增加金额
     * 11：  如果操作后 商品数量小于等于0  从购物车明细数据中移除该商品
     * 12. 如果移除后cart的明细数量小于等于0 则移除整个Cart
     */
    @Override
    public List<Cart> addToCart(List<Cart> cartList, Long itemId, Integer num) {
        //1：根据商品sukid 查询商品信息
        Result<Item> result = itemFeign.findById(itemId);
        Item item = result.getData();
        if (item == null) {
            throw new RuntimeException("该商品已经售罄");
        }
        if (!item.getStatus().equals("1")) {
            throw new RuntimeException("该商品已下架");
        }
        //2： 获取商家id
        String sellerId = item.getSellerId();


        //3：根据商家 id 判断 购物车是否含有该商家的购物车数据
        Cart cart = findBySellerId(cartList, sellerId);

        //4： 如果数据库中不存在 该商家购物车
        if (cart == null) {
            //     5： 新建购物车对象
            cart = new Cart();
            cart.setSellerId(sellerId);
            cart.setSellerName(item.getSeller());
            OrderItem orderItem = createOrderItem(item, num);
            List orderItemList = new ArrayList();
            orderItemList.add(orderItem);

            //6：把购物车对象存储到List《Cart》
            cart.setOrderItemList(orderItemList);
            cartList.add(cart);

            //7：如果购物车列表中存在该商家的购物车
        } else {
            //    8： 判断购物车明细中是否含有该商品
            OrderItem orderItem = findOrderItem(cart.getOrderItemList(), itemId);


            //9：如果没有，新增购物车明细
            if (orderItem == null) {
                orderItem = createOrderItem(item, num);
                cart.getOrderItemList().add(orderItem);
            } else {
                //         10：如果有，增加数量，增加金额
                orderItem.setNum(item.getNum() + num);
                BigDecimal bigDecimal = new BigDecimal(orderItem.getNum());
                BigDecimal multiply = bigDecimal.multiply(orderItem.getPrice());
                orderItem.setTotalFee(multiply);
                //11：  如果操作后 商品数量小于等于0  从购物车明细数据中移除该
                if (orderItem.getNum() <= 0) {
                    cart.getOrderItemList().remove(orderItem);
                }
                //12. 如果移除后cart的明细数量小于等于0 则移除整个Cart
                if (cart.getOrderItemList().size() == 0) {
                    cartList.remove(cart);
                }
            }

        }

        return cartList;
        //1. 根据商品skuid查询商品信息
//        Result<Item> result = itemFeign.findById(itemId);
//        Item item = result.getData();
//        if (null == item){
//            throw new RuntimeException("商品已售罄");
//        }
//        if (!"1".equals(item.getStatus())){
//            throw new RuntimeException("商品已下架！");
//        }
//        //2. 获取商家id
//        String sellerId = item.getSellerId();
//        // 3. 根据商家id判断购物车数据中是否含有该商家的购物车数据
//        Cart cart = findBySellerId(cartList,sellerId);
//        // 4. 如果不存在该商家的购物车
//        if (cart == null){
//          //5. 新建购物车对象
//          cart = new Cart();
//          cart.setSellerId(sellerId);
//          cart.setSellerName(item.getSeller());
//          OrderItem orderItem = createOrderItem(item,num);
//          List orderItemList = new ArrayList();
//          orderItemList.add(orderItem);
//          // 6.把购物车对象存储到List《Cart》
//          cart.setOrderItemList(orderItemList);
//          cartList.add(cart);
//          //7. 如果购物车列表中存在该商家的购物车
//        } else {
//            //8. 判断购物车明细中是否含有该商品
//            OrderItem orderItem = findOrderItem(cart.getOrderItemList(),itemId);
//            if (null == orderItem){
//               // 9. 如果没有，新增购物车明细
//                orderItem = createOrderItem(item,num);
//                cart.getOrderItemList().add(orderItem);
//                //10. 如果有，增加数量，增加金额
//            } else {
//                orderItem.setNum(item.getNum() + num);
//                BigDecimal decimal = new BigDecimal(orderItem.getNum());
//                BigDecimal multiply = decimal.multiply(orderItem.getPrice());
//                orderItem.setTotalFee(multiply);
//               //11. 如果操作后 商品数量小于等于0  从购物车明细数据中移除该商品
//                if (orderItem.getNum() <= 0){
//                    cart.getOrderItemList().remove(orderItem);
//                }
//                // 12. 如果移除后cart的明细数量小于等于0 则移除整个Cart
//                if (cart.getOrderItemList().size() == 0){
//                    cartList.remove(cart);
//                }
//            }
//        }
//        return cartList;

    }

    /**
     * @param orderItemList
     * @param itemId
     * @return
     */
    private OrderItem findOrderItem(List<OrderItem> orderItemList, Long itemId) {
        for (OrderItem orderItem : orderItemList) {
            if (orderItem.getItemId().longValue() == itemId.longValue()) {
                return orderItem;
            }
        }
        return null;
    }

    /**
     * 根据商家 id 判断 购物车是否含有该商家的购物车数
     *
     * @param item
     * @param num
     * @return
     */
    private OrderItem createOrderItem(Item item, Integer num) {
        if (num <= 0) {
            throw new RuntimeException("数量不正确");
        }
        OrderItem orderItem = new OrderItem();
        orderItem.setItemId(item.getId());
        orderItem.setNum(num);
        orderItem.setGoodsId(item.getGoodsId());
        orderItem.setPicPath(item.getImage());
        orderItem.setPrice(item.getPrice());
        orderItem.setSellerId(item.getSellerId());
        orderItem.setTitle(item.getTitle());
        BigDecimal decimal = new BigDecimal(orderItem.getNum());
        BigDecimal multiply = decimal.multiply(orderItem.getPrice());
        orderItem.setTotalFee(multiply);
        return orderItem;
    }

    private Cart findBySellerId(List<Cart> cartList, String sellerId) {
        for (Cart cart : cartList) {
            if (cart.getSellerId() == sellerId) {
                return cart;
            }
        }
        return null;
    }

    /**
     * 从redis进行查询
     * @param username
     * @return
     */
    @Override
    public List<Cart> findFromRedis(String username) {
        List<Cart> cartList = (List<Cart>) redisTemplate.boundHashOps("cartList").get(username);
        if (cartList == null) {
            cartList = new ArrayList<>();
        }
        return cartList;
    }

    @Override
    public void saveToRedis(String username, List<Cart> cartList) {
        redisTemplate.boundHashOps("cartList").put(username, cartList);
    }
}
